<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <div>
    <h1>Object.defineProperty</h1>
    Object.defineproperty 的作用就是直接在一个对象上定义一个新属性，或者修改一个已经存在的属性
    <p>
      Object.defineproperty方法需要传递3个参数

      Object.defineproperty（obj, prop, desc ）

      参数1：obj 需要定义属性的当前对象

      参数2：prop 当前需要定义的属性名

      参数3：desc 描述符 一般是一个对象
      ————————————————
      <br>
      最后还有最重要的两个属性 set和get（即存取器描述：定义属性如何被存取），这两个属性是做什么用的呢？

      注意：当使用了getter或setter方法，不允许使用writable和value这两个属性(如果使用，会直接报错滴)

      　　get 是获取值的时候的方法，类型为 function ，获取值的时候会被调用，不设置时为 undefined

      　　set 是设置值的时候的方法，类型为 function ，设置值的时候会被调用，undefined

      　　get或set不是必须成对出现，任写其一就可以
      ————————————————
  </div>
</body>
<script>
  let obj = {
    name: "laowang",
    age: 22,
    sex: "男"
  }
  console.log(obj, "前OBJ");
  Object.defineProperty(obj, "name", {
    // value: "dawang",
    // writable: false,
    // enumerable: false,
    // configurable: false,
  })
  // obj.name = "xiaowang"
  // console.log(obj, "修改了OBJ 改不了");
  
  // console.log(obj.age);


  Object.defineProperty(obj, "name", {
    get(){
      //每次读取当前需要定义的属性名 就会调用get函数 所以不能直接返回这个值
      // console.log("获取值了");
      return "获取值了"
    },
    set(newVal){
       //每次修改当前需要定义的属性名 就会调用set函数  参数是修改的值 主要看属性上有没有对应的方法
      console.log("值变更了",newVal);
    }
  })

  obj.name = "xiaohei"






</script>

</html>